import 'package:flutter/material.dart';

//缩放路由动画
class YBRouterScaleUtils<T> extends PageRouteBuilder<T>{
  final Widget child;
  final int durationMs;
  final Curve curve;
  YBRouterScaleUtils({this.child,this.durationMs = 500, this.curve = Curves.fastOutSlowIn}): super(
    pageBuilder:(context, animation, secondaryAnimation) => child,
    transitionDuration: Duration(milliseconds: durationMs),
    transitionsBuilder:(context, a1,a2,child) => ScaleTransition(scale: Tween(begin: 0.0, end: 1.0).animate(
      CurvedAnimation(parent: a1, curve: curve)),
      child: child,
    )
  );
}

//渐变透明路由动画
class YBFadeRouter<T> extends PageRouteBuilder<T>{
  final Widget child;
  final int durationMs;
  final Curve curve;
  YBFadeRouter({this.child,this.durationMs = 500, this.curve = Curves.fastOutSlowIn}) : super(
      pageBuilder: (context, animation, secondaryAnimation) => child,
      transitionDuration: Duration(milliseconds: durationMs),
      transitionsBuilder: (context, a1, a2, child) =>
          FadeTransition(
            opacity: Tween(begin: 0.1, end: 1.0).animate(
                CurvedAnimation(parent: a1, curve:curve,)),
            child: child,
          )
  );
}

//旋转路由动画
class YBRotateRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int durationMs;
  final Curve curve;
  YBRotateRouter({this.child, this.durationMs = 500,this.curve=Curves.fastOutSlowIn})
      : super(
      pageBuilder: (context, animation, secondaryAnimation) => child,
      transitionDuration: Duration(milliseconds: durationMs),
      transitionsBuilder: (context, a1, a2, child) =>
          RotationTransition(
            turns: Tween(begin: 0.1, end: 1.0).animate(
                CurvedAnimation(parent: a1, curve:curve,)),
            child: child,
          ));
}

//右--->左
class YBRight2LeftRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int durationMs;
  final Curve curve;
  YBRight2LeftRouter({this.child,this.durationMs=500,this.curve=Curves.fastOutSlowIn})
      :super(
      transitionDuration:Duration(milliseconds: durationMs),
      pageBuilder:(ctx,a1,a2)=>child,
      transitionsBuilder:(ctx,a1,a2, child,) =>
          SlideTransition(
            child: child,
            position: Tween<Offset>(
              begin: Offset(1.0, 0.0), end: Offset(0.0, 0.0),).animate(
                CurvedAnimation(parent: a1, curve: curve)),
          ));
}


//左--->右
class YBLeft2RightRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int durationMs;
  final Curve curve;
  List<int> mapper;
  YBLeft2RightRouter({this.child,this.durationMs=500,this.curve=Curves.fastOutSlowIn})
      :assert(true),super(
      transitionDuration:Duration(milliseconds: durationMs),
      pageBuilder:(ctx,a1,a2){return child;},
      transitionsBuilder:(ctx,a1,a2,child,) {
        return SlideTransition(
            position: Tween<Offset>(
              begin: Offset(-1.0, 0.0), end: Offset(0.0, 0.0),).animate(
                CurvedAnimation(parent: a1, curve: curve)),
            child:  child
        );
      });
}

//上--->下
class YBTop2BottomRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int durationMs;
  final Curve curve;
  YBTop2BottomRouter({this.child,this.durationMs=500,this.curve=Curves.fastOutSlowIn})
      :super(
      transitionDuration:Duration(milliseconds: durationMs),
      pageBuilder:(ctx,a1,a2){return child;},
      transitionsBuilder:(ctx,a1,a2, child,) {
        return SlideTransition(
            position: Tween<Offset>(
              begin: Offset(0.0,-1.0), end: Offset(0.0, 0.0),).animate(
                CurvedAnimation(parent: a1, curve: curve)),
            child:  child
        );
      });
}

//下--->上
class YBBottom2TopRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int durationMs;
  final Curve curve;
  YBBottom2TopRouter({this.child,this.durationMs=500,this.curve=Curves.fastOutSlowIn})
      :super(
      transitionDuration:Duration(milliseconds: durationMs),
      pageBuilder:(ctx,a1,a2)=> child,
      transitionsBuilder:(ctx,a1,a2, child,) {
        return SlideTransition(
            position: Tween<Offset>(
              begin: Offset(0.0, 1.0), end: Offset(0.0, 0.0),).animate(
                CurvedAnimation(parent: a1, curve: curve)),
            child:  child
        );
      });
}


//缩放+透明+旋转路由动画
class YBScaleFadeRotateRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int durationMs;
  final Curve curve;
  YBScaleFadeRotateRouter({this.child, this.durationMs = 1000,this.curve=Curves.fastOutSlowIn}) : super(
      transitionDuration: Duration(milliseconds: durationMs),
      pageBuilder: (ctx, a1, a2)=>child,//页面
      transitionsBuilder: (ctx, a1, a2, Widget child,) =>
          RotationTransition(//旋转动画
            turns: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(
              parent: a1,
              curve: curve,
            )),
            child: ScaleTransition(//缩放动画
              scale: Tween(begin: 0.0, end: 1.0).animate(
                  CurvedAnimation(parent: a1, curve: curve)),
              child: FadeTransition(opacity://透明度动画
              Tween(begin: 0.5, end: 1.0).animate(CurvedAnimation(parent: a1, curve: curve)),
                child: child,),
            ),
          ));
}


//无动画
class YBNoAnimRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  YBNoAnimRouter({this.child})
      : super(
      opaque: false,
      pageBuilder: (context, animation, secondaryAnimation) => child,
      transitionDuration: Duration(milliseconds: 0),
      transitionsBuilder:
          (context, animation, secondaryAnimation, child) => child);
}
